package com.day01;

/**
 * 变量是java申请的一块内存区域
 * 有整型，浮点型等
 * java是强类型语言
 * 2.说明:
 * 必须先声明，然后才能去使用
 * 变量必须定义在其作用域中，在作用域内，它是有效的，换句话说，出了作用域，就失效了
 * 同一个作用域内不可以声明两个同名的变量名称。
 * 一.数据类型分为基本数据类型和引用数据类型
 * 基本数据类型:
 * 1bit=一个二进制位计算机中最小的存储单元，byte:计算机中最基本的存储单元
 * 整型: byte ：占用存储单位8bit位 = 1字节  -128~127
 * \ short ：2字节   -2^15 ~ 2^15 - 1
 * \ int ： 4字节   -2^31 ~ 2^31-1(约21亿)
 * \ long : 8字节   -2^63 ~ 2^63-1
 * 浮点型: float \ double
 * 字符型: char
 * 布尔型: boolean
 * <p>
 * 引用数据类型:
 * 类（class)
 * 接口(interface)
 * 数组(array)
 * 二、变量在类中声明的位置:
 * 成员变量 vs 局部变量
 */
public class VariableTest {
    public static void main(String[] args) {
        int myAge = 12;
        System.out.println(myAge);

        double myMoney = 121212121211111212.212121212121;
        System.out.println(myMoney);

        //变量的声明
        int myNumber;
        //变量的赋值
        myNumber = 1001;
        System.out.println(myNumber);

        //整形：byte(1字节=8bit)
        byte b1 = 12;
        byte b2 = -128;
        //如果超出范围，编译不通过
//        b2 = 128;
        System.out.println(b1);
        System.out.println(b2);
        //2.short声明long型变量，必须以"l"或"L"结尾
        short s1 = 128;
        int i1 = 1234;
        //只是为了做一个声明这是长整型
        //开发中常用的是int类型
        long l1 = 3232421L;
        System.out.println(l1);

        //浮点型: float \ double
        //浮点型也有固定的表数范围和字段长度，通俗来讲就是带小数点的数
        //浮点型常量有两种表示形式:
        /**
         * 十进制数形式: 如: 5.12, 512.0f   .512(必须有小数点)
         * 科学计数法表示：如: 5.12e2, 512E2, 100E-2
         *
         * float:单精度，尾数可以精确到7位有效数字。很多情况下，精度很难满足需求
         * double:双精度，精度是float的两倍，通常采用此类型
         */
        //java的浮点型常量默认是double型，声明是float型常量，须后加'f'或'F'。
        /**
         * E--->10  -3.403E38-->相对于-3.403乘以10的38次方
         * 单精度float 4字节   -3.403E38 ~ 3.403E38
         * 双精度double 8字节   -1.798E308 ~ 1.798E308
         * float虽然只占4个字节，但是是它大于8个字节的long
         */
        double d1 = 123.4;
        System.out.println(d1 + 1);

        //float类型变量时，变量要以"f"或"F"结尾
        float f1 = 12.3f;
        System.out.println(f1);
        //平常定义浮点型时，使用double

        //3.字符型: char(1字符 = 2字节)
        //定义字符型char变量，通常使用一对''
        //只能写一个字符
        char c1 = 'a';
        c1 = 'A';
        System.out.println(c1);
        c1 = '薛';
        System.out.println(c1);
        /**
         * char类型数据用来表示通常意义上"字符"(2字节)
         * java中所有的字符都是使用Unicode编码，故一个字符可以存储一个字母，一个汉字或一个转义字符等。
         * 字符型变量的三种表现形式:
         *  字符常量是用单引号('')括起来的单个字符，例如:char c1 = 'a',char c2 = '中'，char c3 = '9';
         *  java中还允许使用转义字符'\'来将其后的字符转变为特殊字符型常量。
         *  直接使用Unicode值来表示字符型常量: 。其中，XXXXX代表一个十六进制整数。如：\u000a表示\n。
         *  char 类型是可以进行运算的，因为它都有对应的Unicode码。
         */
        //表示方式:1.声明一个字符，2.转义字符
        char c5 = '\n'; //换行符
        char c6 = '\t';//制表符
        char c7 = '\u0043';
        System.out.println(c7);

        //4.布尔型：boolean
        //1.只能取两个值之一: true、false
        //2.常常在条件判断、循环结构中使用
        boolean be1 = true;
        boolean be2 = false;

        boolean isMarried = true;
        if (isMarried) {
            System.out.println("hhhhh hh");
        } else {
            System.out.println("输出 \\n");
        }

    }

}
//逆向思维，反证法
//class VariableTest{
//
//}

/**
 * java的内存体制
 * example:
 * long fw = 10000000000L;
 * 实际上内存中fw只是一个long类型的变量，它存在于向stack（栈）中，数值并不在其中存放，它指向heap（堆）中另一块真正存放数值的内存，加L的目的就是为了让heap中也创建一块long类型所需要的内存，用来来放数值。
 * 所以说=前后两者其实是在不同的两块内存，只不过有个无形的指针将两者连接起来了。
 * <p>
 * 问：
 * 整数的默认的数据类型是int，那为什么byte和short类型后面不用加东西？
 * 答：
 * java整型默认为int，且java会自动向下转型，byte和short都可以由int自动向下转型，但是long类型的不能自动向上转型，所以要加L，转为long类型
 * <p>
 * <p>
 * <p>
 * 不加的后果：
 * <p>
 * 不加L默认是int，int转为long是安全的，所以会自动转，能编译通过
 * 浮点数不加F默认是double类型，double转float可能损失精度，因为不会自动转，编译通不过
 * 如果超过int的取值范围还不加L，那么也会直接报错了
 * ————————————————
 * 版权声明：本文为CSDN博主「Loongstyle」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/Loongstyle/article/details/81668127
 */


